package model

import (
	"fmt"
	"os"
	"strings"

	"gitee.com/liumou_site/logger"
)

// ipv4 方法用于更新IPv4类型的域名记录
func (l *Login) ipv4() {
	// 检查是否需要更新A记录或所有记录
	if strings.EqualFold(l.Domain.Domain.Type, "all") || strings.EqualFold(l.Domain.Domain.Type, "A") {
		l.Url = fmt.Sprintf("%s.%s", l.Domain.Domain.Sub4, l.Domain.Domain.Domain)
		l.IPS.IpType = "A"
		logger.Info("正在更新V4记录: ", l.IPS.IpType)
		// 获取当前子域名的记录ID
		l.GetRecordId(l.Domain.Domain.Sub4)
		// 如果记录存在且IPV4连接正常，则进行更新或删除操作
		if l.Exists && l.IPS.Ip4Exists {
			if l.Debug {
				logger.Debug("检测到当前IPV4连接正常,正在更新解析")
			}
			// 设置当前IP和IP类型为IPv4
			l.IPS.Ip = l.IPS.IP4
			// 如果配置了删除选项，则删除现有记录并重新添加
			if l.Domain.Option.Delete {
				if l.Debug {
					logger.Debug("检测到当前记录存在,正在删除...")
				}
				err := l.Delete(l.Domain.Domain.Sub4, uint64(l.RecordId))
				if err != nil {
					logger.Debug(l.Domain.Domain.Sub4)
					logger.Debug(l.RecordId4)
					logger.Debug(l.RecordId)
					logger.Error(err.Error())
					return
				}
				if l.Debug {
					logger.Debug("删除成功,正在重新添加...")
				}
				l.Add(l.IPS.Ip)
			} else {
				// 如果未配置删除选项，则直接更新现有记录
				if l.Debug {
					logger.Debug("检测到当前记录存在,正在更新...")
				}
				l.Update(l.RecordId4, l.IPS.IP4, l.Domain.Domain.Sub4)
			}
		} else {
			// 如果记录不存在，则直接添加新的记录
			l.Add(l.IPS.IP4)
		}
	}
}

// ipv6处理IPv6地址的更新
// 此函数首先检查是否需要更新IPv6地址（AAAA记录）或所有类型的记录
// 如果需要更新，它会根据当前的IPv6连接状态和DNS记录的存在情况来执行相应的更新操作
func (l *Login) ipv6() {
	// 如果IPv6地址不存在，则记录警告并退出函数
	if !l.IPS.Ip6Exists {
		logger.Warn("IPv6连接异常,跳过IPv6更新")
		return
	}
	// 检查是否需要更新AAAA记录或全部记录
	if strings.EqualFold(l.Domain.Domain.Type, "all") || strings.EqualFold(l.Domain.Domain.Type, "AAAA") {
		l.Url = fmt.Sprintf("%s.%s", l.Domain.Domain.Sub6, l.Domain.Domain.Domain)
		l.IPS.IpType = "AAAA"
		logger.Info("正在更新V6记录: ", l.IPS.IpType)
		l.GetRecordId(l.Domain.Domain.Sub6)
		// 如果IPv6连接正常且记录存在
		if l.IPS.Ip6Exists && l.Exists {
			if l.Debug {
				logger.Debug("检测到当前IPV6连接正常,正在更新解析")
			}
			l.IPS.Ip = l.IPS.IP6

			// 如果配置为删除记录，则先删除再重新添加
			if l.Domain.Option.Delete {
				if l.Debug {
					logger.Debug("检测到当前记录存在,正在删除...")
				}
				err := l.Delete(l.Domain.Domain.Sub4, uint64(l.RecordId4))
				if err != nil {
					logger.Error(err.Error())
					return
				}
				if l.Debug {
					logger.Debug("删除成功,正在重新添加...")
				}
				l.Add(l.IPS.IP6)
			} else {
				// 否则直接更新记录
				if l.Debug {
					logger.Debug("检测到当前记录存在,正在更新... ", l.Domain.Domain.Sub4)
				}
				l.Update(l.RecordId6, l.IPS.IP6, l.Domain.Domain.Sub6)
			}
		} else {
			// 如果记录不存在，则直接添加新的记录
			l.Add(l.IPS.IP6)
		}
	}
}

// Start 方法启动登录流程，负责构建域名、校验配置、获取IP地址并处理IPv4/IPv6。
// 参数:
//   - l: 指向Login结构体的指针，包含域名、配置、IP信息等字段
//
// 返回值:
//
//	无。若出现错误，将记录日志并直接退出程序
func (l *Login) Start() {
	// 构建完整的域名，格式为"子域名.主域名"
	l.Url = fmt.Sprintf("%s.%s", l.Domain.Domain.Sub, l.Domain.Domain.Domain)

	// 去除字符串中的空字符以避免干扰后续处理
	l.RemoveStrNone()

	// 检查必要的环境变量配置是否已正确设置
	l.CheckConfig()

	// 获取并解析IP地址列表，若失败则记录错误并退出
	err := l.GetParseList()
	if err != nil {
		logger.Error(err.Error())
		os.Exit(2)
	}
	l.IPS.Debug = l.Debug
	l.IPS.GetIp()

	// 验证IP地址有效性，若获取失败则记录错误并返回
	if l.IPS.Err != nil {
		logger.Error(l.IPS.Err.Error())
		return
	}

	// 执行IPv4/IPv6协议相关处理逻辑
	l.ipv4()
	l.ipv6()
}
